package com.old.aspect;

import com.old.annotation.AutoFill;
import com.old.enumeration.OperationType;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Date;

@Aspect
@Component
public class AutoFillAspect {

    // 切入点：匹配标注了 @AutoFill 注解的方法
    @Before("@annotation(autoFill)")
    public void autoFill(JoinPoint joinPoint, AutoFill autoFill) throws Exception {
        // 获取当前操作类型
        OperationType operationType = autoFill.value();
        System.out.println("AOP切面被触发！"); // 添加日志
        // 获取方法参数
        Object[] args = joinPoint.getArgs();

        if (args != null) {
            for (Object arg : args) {
                // 针对每个参数进行字段填充
                fillFields(arg, operationType);
            }
        }
    }

    private void fillFields(Object obj, OperationType operationType) throws IllegalAccessException {
        // 获取对象的所有字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true); // 设置可访问私有字段
            // 针对每个字段进行填充
            if (field.getName().equals("createTime")) {
                if (operationType == OperationType.INSERT && field.get(obj) == null) {
                    // 如果是插入操作且字段为空，填充当前时间
                    field.set(obj, LocalDateTime.now());
                }
            } else if (field.getName().equals("updateTime")) {
                if (operationType == OperationType.UPDATE) {
                    // 如果是更新操作，填充当前时间
                    field.set(obj, LocalDateTime.now());
                }
            }
        }

        System.out.println(obj);
    }
}

